/*
 *所有关于tb_project_reviewstandar类的业务代码应在此处编写
*可使用repository.调用常用方法，获取EF/Dapper等信息
*如果需要事务请使用repository.DbContextBeginTransaction
*也可使用DBServerProvider.手动获取数据库相关信息
*用户信息、权限、角色等使用UserContext.Current操作
*tb_project_reviewstandarService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
*/
using Mapster;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using SqlSugar;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MYData.Core.EFDbContext;
using MYData.Core.Utilities;
using MYData.Core.Utilities.Response;
using MYData.Entity.DomainModels;
using MYData.Entity.DomainModels.ApiEntity;
using MYData.Entity.DomainModels.ApiEntity.Dto;
using MYData.System.IRepositories;
using MYData.System.IServices;

namespace MYData.System.Services
{
    public partial class tb_project_reviewstandarService : Itb_project_reviewstandarService
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly Itb_project_reviewstandarRepository _repository;//访问数据库
        public readonly VOLContext _db;


        [ActivatorUtilitiesConstructor]
        public tb_project_reviewstandarService(
            Itb_project_reviewstandarRepository dbRepository,
            IHttpContextAccessor httpContextAccessor,
            VOLContext db
            )
        : base(dbRepository)
        {
            _httpContextAccessor = httpContextAccessor;
            _repository = dbRepository;
            _db = db;
            //多租户会用到这init代码，其他情况可以不用
            //base.Init(dbRepository);
        }
        public void AddList(tb_project_reviewstandarinputDto Dto)
        {
            var model = Dto.Adapt<tb_project_reviewstandar>();
            _repository.Add(model);
        }
        WebResponseContent webResponse = new WebResponseContent();
        /// <summary>
        /// 评审标准库+查询
        /// 名称模糊查询
        /// </summary>
        /// <returns></returns>
        //异步方法使你的程序可以在执行一个可能长期运行的任务的同时继续对其他事件做出反应而不必等待任务完成
        public async Task<WebResponseContent> GetReviewstandar(string standarName = "", string? standardselectionID = "")
        {
            //LINQ查询用于连接数据库中的tb_project_reviewstandar和tb_project_reviewstandar_item表
            var list = (from x in _db.Set<tb_project_reviewstandar>().Where(x => x.isDelete == 0)
                        join y in _db.Set<tb_project_reviewstandar_item>() on x.standardselectionID equals y.standardselectionID
                        //'isDel'属性为0(意味着条目没有被删除)的两个表中选择特定的属性。
                        select new
                        {
                            x.standarID,
                            x.standarName,
                            x.remark,
                            x.scoreType,
                            x.isDelete,
                            x.standardselectionID,
                            y.totalPoints,
                            y.dselectionName,
                        }).ToList();
            //如果提供了specialistName参数，则在专家名称包含所提供的字符串的地方对列表进行筛选
            if (!string.IsNullOrEmpty(standarName))
            {
                list = list.Where(x => x.standarName.Contains(standarName)).ToList();
            }
            //下拉
            if (!string.IsNullOrEmpty(standardselectionID))
            {
                list = list.Where(x => x.standardselectionID == standardselectionID).ToList();
            }
            //结果集作为匿名对象返回
            return webResponse.OK("显示成功", list);
        }
       

        /// <summary>
        /// 标准添加
        /// </summary>
        /// <param name="inputdto"></param>
        /// <returns></returns>
        /// 异步编程技术使你的程序可以在执行一个可能长期运行的任务的同时继续对其他事件做出反应而不必等待任务完成。
        public WebResponseContent InsertReviewstandar(tb_project_reviewstandarinputDto inputdto)
        {
            _db.Database.BeginTransaction();
            try
            {
                // 将输入Dto转换为领域模型
                var model = inputdto.Adapt<tb_project_reviewstandar>();
                // 添加基本信息到数据库
                _db.Set<tb_project_reviewstandar>().Add(model);
                if (_db.SaveChanges()<1)
                {
                    _db.Database.RollbackTransaction();
                    return webResponse.Error("标准表添加失败！！！");
                }
                //提交事务
                _db.Database.CommitTransaction();
                //保存更改并返回
                return webResponse.OK("添加成功!", true);
            }
            catch (global::System.Exception)
            {
                _db.Database.RollbackTransaction();
                return webResponse.Error("添加失败！！！");

            }

        }

        /// <summary>
        /// 申报通知修改
        /// </summary>
        /// <param name="inputdto"></param>
        /// <returns></returns>
        public WebResponseContent UpdateInsertReviewstandar(tb_project_reviewstandaroutputDto inputdto)
        {
            _db.Database.BeginTransaction();
            try
            {
                // 将输入Dto转换为领域模型
                var model = inputdto.Adapt<tb_project_reviewstandar>();
                // 添加基本信息到数据库
                _db.Set<tb_project_reviewstandar>().Update(model);
                if (_db.SaveChanges() < 1)
                {
                    _db.Database.RollbackTransaction();
                    return webResponse.Error("标准表修改失败！！！");
                }
                //提交事务
                _db.Database.CommitTransaction();
                //保存更改并返回
                return webResponse.OK("修改成功!", true);
            }
            catch (global::System.Exception)
            {
                _db.Database.RollbackTransaction();
                return webResponse.Error("修改失败！！！");

            }

        }

         

        /// <summary>
        /// 删除(逻辑删除)
        /// </summary>
        /// <param name="id">Id</param>
        /// <returns></returns>
        public WebResponseContent DeleteReviewstandar(string id)
        {
            _db.Database.BeginTransaction();
            try
            {
                //根据id获取数据查找 tb_project_reviewstandar 表中对应的项，通过参数 id 传入标准项ID
                var delappendix = _db.Set<tb_project_reviewstandar>().Find(id);
                //修改状态
                delappendix.isDelete = 1;
                //更新表中的数据
                _db.UpdateRange(delappendix);
                if (_db.SaveChanges() < 1)
                {
                    //失败 事务回滚
                    _db.Database.RollbackTransaction();
                    return webResponse.Error("评审选项表删除失败！！！");
                }
                //返回状态
                _db.SaveChanges();
                //提交事务
                _db.Database.CommitTransaction();
                //使用检索到的信息返回一个成功的响应
                return webResponse.OK("删除成功");
            }
            catch (global::System.Exception)
            {
                //回滚
                _db.Database.RollbackTransaction();
                return webResponse.Error("删除失败！！！");
            }
        }


        /// <summary>
        /// 详情/反填
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<WebResponseContent> GetDetailReviewstandar(string id)
        {
            //LINQ查询用于连接数据库中的tb_project_reviewstandar和tb_project_reviewstandar_item表
            var list = from x in _db.Set<tb_project_reviewstandar>().Where(x => x.isDelete == 0).Where(x => x.standarID == id)
                        join y in _db.Set<tb_project_reviewstandar_item>() on x.standardselectionID equals y.standardselectionID
                        select new
                        {
                            x,
                            y
                        };
            return webResponse.OK("显示成功", list);
        }
    }
}